package sifeap.bl.ejb.reportes;

import java.io.File;
import java.net.URL;
import java.text.NumberFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import sifeap.bridge.AportesBridge;
import sifeap.bridge.CreditosBridge;
import sifeap.bridge.VinculadosBridge;
import sifeap.dal.ejb.reportes.ReporteDALLocal;
import sifeap.dal.ejb.solicitudescredito.TipoCreditoDALLocal;
import sifeap.entities.solicitudesauxilio.valueobject.SolicitudAuxilioVO;
import sifeap.entities.solicitudescredito.TipoCredito;
import sifeap.entities.solicitudescredito.valueobject.SolicitudCreditoVO;
import sifeap.exception.SifeapException;
import sifeap.wrappers.aportes.AporteWrapper;
import sifeap.wrappers.asociados.VinculadoWrapper;
import sifeap.wrappers.creditos.CreditoWrapper;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="ReporteBL")
public class ReporteBL implements ReporteBLLocal {

	@EJB
	private ReporteDALLocal reporteDAL;
	
	@EJB
	private TipoCreditoDALLocal tipoCreditoDAL;
	
	@Override
	public byte[] generarReporteSolicitudesCredito(SolicitudCreditoVO solicitudCreditoVo, List<String> tiposCredito, List<String> estadosCredito) throws SifeapException {
		byte[] reporte = null;
		try {
			String consulta = reporteDAL.generarConsultaSolicitudesCredito(solicitudCreditoVo, tiposCredito, estadosCredito);
			
			if (consulta != null) {
				HashMap<String, Object> parametros = new HashMap<String, Object>();
				
				parametros.put("P_QUERY", consulta);
			
				String rutaPlantilla = obtenerPathReporte("ReporteSolicitudesCredito.jasper");
				JasperPrint jasperPrint= JasperFillManager.fillReport(rutaPlantilla, parametros, reporteDAL.obtenerConexion());
				reporte = JasperExportManager.exportReportToPdf(jasperPrint);
			}
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		return reporte;
	}
	
	@Override
	public byte[] generarReporteSolicitudesAuxilio(SolicitudAuxilioVO solicitudAuxilioVo, List<String> tiposAuxilio, List<String> estadosAuxilio) throws SifeapException {
		byte[] reporte = null;
		try {
			String consulta = reporteDAL.generarConsultaSolicitudesAuxilio(solicitudAuxilioVo, tiposAuxilio, estadosAuxilio);
			
			if (consulta != null) {
				HashMap<String, Object> parametros = new HashMap<String, Object>();
				
				parametros.put("P_QUERY", consulta);
			
				String rutaPlantilla = obtenerPathReporte("ReporteSolicitudesAuxilio.jasper");
				JasperPrint jasperPrint= JasperFillManager.fillReport(rutaPlantilla, parametros, reporteDAL.obtenerConexion());
				reporte = JasperExportManager.exportReportToPdf(jasperPrint);
			}
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		return reporte;
	}

	@Override
	public byte[] generarReporteCantidadCreditos(SolicitudCreditoVO solicitudCreditoVo, List<String> tiposCredito, List<String> estadosCredito) throws SifeapException {
		byte[] reporte = null;
		try {
			String consulta = reporteDAL.generarConsultaCantidadesCredito(solicitudCreditoVo, tiposCredito, estadosCredito);
			
			if (consulta != null) {
				HashMap<String, Object> parametros = new HashMap<String, Object>();
				
				parametros.put("P_QUERY", consulta);
			
				String rutaPlantilla = obtenerPathReporte("ReporteCantidadCreditos.jasper");
				JasperPrint jasperPrint= JasperFillManager.fillReport(rutaPlantilla, parametros, reporteDAL.obtenerConexion());
				reporte = JasperExportManager.exportReportToPdf(jasperPrint);
			}
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		return reporte;
	}
	
	@Override
	public byte[] generarReporteCantidadAuxilios(SolicitudAuxilioVO solicitudAuxilioVo, List<String> tiposAuxilio, List<String> estadosAuxilio) throws SifeapException {
		byte[] reporte = null;
		try {
			String consulta = reporteDAL.generarConsultaCantidadesAuxilio(solicitudAuxilioVo, tiposAuxilio, estadosAuxilio);
			
			if (consulta != null) {
				HashMap<String, Object> parametros = new HashMap<String, Object>();
				
				parametros.put("P_QUERY", consulta);
			
				String rutaPlantilla = obtenerPathReporte("ReporteCantidadAuxilios.jasper");
				JasperPrint jasperPrint= JasperFillManager.fillReport(rutaPlantilla, parametros, reporteDAL.obtenerConexion());
				reporte = JasperExportManager.exportReportToPdf(jasperPrint);
			}
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		return reporte;
	}
	
	private String obtenerPathReporte(String nombreReporte) {
		URL pathURL = this.getClass().getResource(nombreReporte);
		File path = new File(pathURL.getPath());
		String rutaPlantilla = path.getAbsolutePath();
		return rutaPlantilla;
	}

	@Override
	public byte[] generarReporteEstadoCuenta(String cedula, Date fechaInicio, Date fechaFin) throws SifeapException {
		byte[] reporte = null;
		try {
			//Se debe verificar si el usuario existe
			VinculadoWrapper asociado = new VinculadosBridge().buscarPorCedula(cedula);
			if (asociado == null) {
				//El asociado no existe
				reporte = new byte[1];
				reporte[0] = -1; //Retorna un arreglo de esta manera para indicar que no existe el usuario
				return reporte;
			}
			
			String nombreAsociado = ((asociado.getPrimerNombre() == null) ? "" : asociado.getPrimerNombre()) + " " 
			+ ((asociado.getSegundoNombre() == null) ? "" : " " + asociado.getSegundoNombre()) + " "
			+ ((asociado.getPrimerApellido() == null) ? "" : " " + asociado.getPrimerApellido()) + " " 
			+ ((asociado.getSegundoApellido() == null) ? "" : " " + asociado.getSegundoApellido());
			
			
			HashMap<String, Object> parametros = new HashMap<String, Object>();
			parametros.put("P_CEDULA_ASOCIADO", cedula);
			parametros.put("P_NOMBRE_ASOCIADO", nombreAsociado);
			
			
			AporteWrapper aportes = new AportesBridge().buscarAportesAsociado(cedula);
			String valorAportes = "";
			if (aportes.getMontoAportes() != null) {
				valorAportes = NumberFormat.getCurrencyInstance(Locale.getDefault()).format(aportes.getMontoAportes());
			} else {
				valorAportes = "$0";
			}
			parametros.put("P_TOTAL_APORTES", valorAportes);
			
			Double totalDeuda = new CreditosBridge().totalDeuda(cedula);
			String valorTotalDeuda = "";
			if (totalDeuda != null) {
				valorTotalDeuda = NumberFormat.getCurrencyInstance(Locale.getDefault()).format(totalDeuda);
			} else {
				valorTotalDeuda = "$0";
			}
			parametros.put("P_TOTAL_DEUDA", valorTotalDeuda);
		
			String rutaPlantilla = obtenerPathReporte("EstadoCuentaAsociado.jasper");
			
			List<CreditoWrapper> listaCreditos = new CreditosBridge().obtenerCreditos(cedula, fechaInicio, fechaFin);
			
			if (listaCreditos != null && listaCreditos.size() > 0) {
				JasperPrint jasperPrint= JasperFillManager.fillReport(rutaPlantilla, parametros, new JRBeanCollectionDataSource(listaCreditos));
				reporte = JasperExportManager.exportReportToPdf(jasperPrint);
			} else {
				reporte = null;
			}
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		return reporte;
	}

	@Override
	public byte[] generarReporteCarteraCredito(SolicitudCreditoVO solicitudCreditoVo) throws SifeapException {
		byte[] reporte = null;
		try {
			HashMap<String, Object> parametros = new HashMap<String, Object>();
			
			//Debe consultar el tipo de credito para obtener el nombre y el id del tipo en Solidario
			TipoCredito tipoCredito = tipoCreditoDAL.buscar(solicitudCreditoVo.getSolicitudCredito().getTiposcredito().getIdTipoCredito());
			parametros.put("P_TIPO_CREDITO", tipoCredito.getNombre()); //Nombre del credito

			String rutaPlantilla = obtenerPathReporte("CarteraLineaCredito.jasper");
			
			List<CreditoWrapper> listaCreditos = new CreditosBridge().obtenerCreditosPorTipo(tipoCredito.getIdTipoCreditoSolidario(), solicitudCreditoVo.getFechaInicio(), solicitudCreditoVo.getFechaFin());
			
			if (listaCreditos != null && listaCreditos.size() > 0) {
				JasperPrint jasperPrint= JasperFillManager.fillReport(rutaPlantilla, parametros, new JRBeanCollectionDataSource(listaCreditos));
				reporte = JasperExportManager.exportReportToPdf(jasperPrint);
			} else {
				reporte = null;
			}
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		return reporte;
	}
}
